﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Course3
{
    /// <summary>
    /// IO
    /// 标准输入输出
    /// 了解文件操作、目录操作
    /// 常用流及api
    ///    内存流，文件流
    /// 包装流
    /// 了解继承关系
    /// 了解托管资源和非托管资源
    /// 了解using语句块
    /// 了解编码方式
    ///     文件都是二进制，文件存成二进制必须得指定一种编码方式（有默认的）
    /// 掌握socket网络IO
    /// 学习对象的序列化
    /// 学习json
    /// </summary>
    internal class Example
    {
        public void Test0()
        {
            //注意流的缓冲问题
            //流关闭的时候会刷新缓冲区
            //明白什么是当前路径.
            var fs = new FileStream(".\\ff.txt", FileMode.OpenOrCreate);
            //这样文件内容会是空的，因为程序还没来得及刷入文件，就退出去了
            Console.SetOut(new StreamWriter(fs));
            Console.WriteLine("fff");
        
        }
        public void Test1()
        {
            //注意流的缓冲问题
            //流关闭的时候会刷新缓冲区
            //明白什么是当前路径.
            using (var fs = new FileStream(".\\ff.txt", FileMode.OpenOrCreate))
            using (var sw = new StreamWriter(fs))
            {
                Console.SetOut(sw);
                Console.WriteLine("fff");
                //文件销毁的时候会主动刷新
                fs.Flush();//清除此流的缓冲区，使得所有缓冲数据都写入到文件中
            }
        }
        /// <summary>
        /// using的本质
        /// 使用using必须实现IDisposable接口
        /// </summary>
        public void Test2()
        {
            FileStream fs = default;
            try
            {
                fs = new FileStream("ffaa.txt", FileMode.Open);
            }
            catch (Exception)
            {

                throw;
            }
            finally 
            {
                //保证对象能强制销毁
                fs.Dispose();
            }
        }
        /// <summary>
        /// 装饰者设计模式
        /// </summary>
        public void Test3()
        {
            var fs = new FileStream("ffaa.txt", FileMode.Open);
            var sr = new StreamReader(fs);
            Console.WriteLine(fs.CanRead);
            sr.Close();//包装类型会负责帮你释放
            //所以可以简写成
            var sr2 = new StreamReader(new FileStream("ffaa.txt", FileMode.Open));
            sr2.Close();
        }
        /// <summary>
        /// 编码转换
        /// 如果两个编码不兼容，保存就会乱码甚至丢失关键信息，导致无法还原
        /// </summary>
        public void ConvertEncoding()
        {
            var ff = "中国";
            var bytes = Encoding.Unicode.GetBytes(ff);
            Console.WriteLine(Encoding.Unicode.GetString(bytes));
            var bytes2 = Encoding.Convert(Encoding.Unicode, Encoding.UTF8, bytes);
            Console.WriteLine(Encoding.UTF8.GetString(bytes2));
        }
    }
}

